package com.sojson.util.mq.rabbit.immit.interfaces;

import java.io.IOException;

import org.springframework.amqp.core.Message;

import com.sojson.util.mq.rabbit.immit.RabbitImmitUtil;
import com.sojson.util.mq.rabbit.interfaces.IRabbitBaseConsumeUtil;

/**
 * Rabbit消费消息工具类接口
 * 
 * @author liu
 * @date 2022-06-16
 */
public interface IRabbitConsumeUtil extends IRabbitBaseConsumeUtil {

    /**
     * 获取消息内容
     * 
     * @param queue     队列名
     * @return
     * @throws IOException
     */
    default String getBody(String queue) throws IOException {
        return getBody(queue, true);
    }

    /**
     * 获取消息内容
     * 
     * @param queue     队列名
     * @param autoAck   是否开启自动确认机制</BR>
     *                  当rabbitmq将消息发送给消费者进行消费时,消费者可能会消费消息失败的情况,用户可以设置消费失败的消息给其他消费者消费或者直接丢弃</br>
     *                  自动确认模式积极的一面是能够拥有更高的吞吐量,但是却存在数据安全的问题</br>
     * @return
     * @throws IOException
     */
    default String getBody(String queue, boolean autoAck) throws IOException {
        // 该模式的主体是消费者,当消费者需要队列中的一条消息时,可以通过该方法去获取到队列中的一条消息
        // 其建立的连接是短连接,当消费者获取到消息后该连接断开
        // 可以通过循环的方式实现和basicConsume相同的效果,但不建议这样去使用
        Message msg = RabbitImmitUtil.getRabbit().receive(getQueueName(queue));
        return new String(msg.getBody());
    }

}